package com.bifang.common.licence;

import cn.hutool.core.date.DatePattern;
import cn.hutool.json.JSONUtil;
import cn.hutool.system.HostInfo;
import cn.hutool.system.OsInfo;
import cn.hutool.system.SystemUtil;
import cn.hutool.system.oshi.CpuInfo;
import cn.hutool.system.oshi.OshiUtil;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.bifang.common.exception.AppException;
import com.bifang.common.vo.CreateLicenceVO;
import com.bifang.common.vo.LicenceVO;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
 * @author lvxk
 * @date 2022-06-08
 * @description 许可证
 */
@Component
public class Licence implements ApplicationRunner {

    public static final String FOREVER_NAME = "forever";
    public static final long MAX_ENDTIME_LENGTH = 10;

    @Resource
    private DynamicRoutingDataSource dynamicRoutingDataSource;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("------------------核心配置文件校验开始----------------------");
        OsInfo osInfo = SystemUtil.getOsInfo();
        HostInfo hostInfo = SystemUtil.getHostInfo();
        CpuInfo cpuInfo = OshiUtil.getCpuInfo();
        System.out.println("服务器操作系统信息：" + JSONUtil.toJsonStr(osInfo));
        System.out.println("服务器HOST信息：" + JSONUtil.toJsonStr(hostInfo));
        System.out.println("服务器CPU信息：" + JSONUtil.toJsonStr(cpuInfo));
        System.out.println("服务器ComputerSystem信息：" + JSONUtil.toJsonStr(OshiUtil.getSystem()));
        CreateLicenceVO createLicenceVO = new CreateLicenceVO();
        createLicenceVO.setHostName(hostInfo.getName());
        createLicenceVO.setHostAddress(hostInfo.getAddress());
        createLicenceVO.setOsName(osInfo.getName());
        createLicenceVO.setOsArch(osInfo.getArch());
        createLicenceVO.setOsVersion(osInfo.getVersion());
        System.out.println("核心配置文件使用服务器信息：" + JSONUtil.toJsonStr(createLicenceVO));
        // 判断配置文件是否被修改
        LicenceVO pro = LicenceUtil.checkHashCode();
        String hashCode = pro.getHashCode();
        String systemDate = DatePattern.PURE_DATE_FORMAT.format(new Date());
        if (StringUtils.isBlank(hashCode)) {
            System.out.println("核心配置文件Licence失效，不能启动！！！请联系系统开发商重新生成");
            throw new AppException("核心配置文件Licence失效，不能启动！！！请联系系统开发商重新生成");
        }
        LicenceVO licenceVO;
        try {
            licenceVO = JSONUtil.toBean(LicenceUtil.dec(hashCode), LicenceVO.class);
        } catch (Exception e) {
            System.out.println("核心配置文件Licence失效，不能启动！！！请联系系统开发商重新生成");
            throw new AppException("核心配置文件Licence失效，不能启动！！！请联系系统开发商重新生成");
        }
        if (!FOREVER_NAME.equals(licenceVO.getEndTime())) {
            if (StringUtils.isBlank(licenceVO.getEndTime())) {
                System.out.println("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置有效期");
                throw new AppException("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置有效期");
            } else {
                if (licenceVO.getEndTime().length() == MAX_ENDTIME_LENGTH) {
                    licenceVO.setEndTime(
                            licenceVO.getEndTime().replaceAll("-", "").replaceAll("/", ""));
                }
                try {
                    if (Integer.parseInt(systemDate) > Integer.parseInt(licenceVO.getEndTime())) {
                        System.out.println("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置有效期");
                        throw new AppException("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置有效期");
                    }
                } catch (Exception e) {
                    System.out.println("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置有效期");
                    throw new AppException("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置有效期");
                }
            }
        }

        if (StringUtils.isNotBlank(licenceVO.getHostName())) {
            List<String> nameList =
                    Arrays.stream(licenceVO.getHostName().split(",")).collect(Collectors.toList());
            if (!nameList.contains(hostInfo.getName())) {
                System.out.println("核心配置文件Licence无效，服务主机host名不在授权范围内,不能启动！！！请联系系统开发商重新设置host名称");
                throw new AppException(
                        "核心配置文件Licence无效，服务主机host名不在授权范围内,不能启动！！！请联系系统开发商重新设置host名称");
            }
        }
        if (StringUtils.isNotBlank(licenceVO.getHostAddress())) {
            List<String> ipList =
                    Arrays.stream(licenceVO.getHostAddress().split(","))
                            .collect(Collectors.toList());
            if (!ipList.contains(hostInfo.getAddress())) {
                System.out.println("核心配置文件Licence无效，服务主机ip地址不在授权范围内，不能启动！！！请联系系统开发商重新设置host（ip）地址");
                throw new AppException(
                        "核心配置文件Licence无效，服务主机ip地址不在授权范围内，不能启动！！！请联系系统开发商重新设置host（ip）地址");
            }
        }
        if (StringUtils.isNotBlank(licenceVO.getOsName())) {
            if (!licenceVO.getOsName().equals(osInfo.getName())) {
                System.out.println("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置操作系统名称");
                throw new AppException("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置操作系统名称");
            }
        }
        if (StringUtils.isNotBlank(licenceVO.getOsArch())) {
            if (!licenceVO.getOsArch().equals(osInfo.getArch())) {
                System.out.println("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置操作系统发行商");
                throw new AppException("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置操作系统发行商");
            }
        }
        if (StringUtils.isNotBlank(licenceVO.getOsVersion())) {
            if (!licenceVO.getOsVersion().equals(osInfo.getVersion())) {
                System.out.println("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置操作系统版本");
                throw new AppException("核心配置文件Licence无效，不能启动！！！请联系系统开发商重新设置操作系统版本");
            }
        }
        System.out.println("------------------核心配置文件校验结束----------------------");
    }
}
